package ar.com.aterrizar.asientos;

import org.uqbar.commons.model.Entity;
import org.uqbar.commons.utils.Observable;
import org.uqbar.commons.utils.Transactional;

import uqbar.arena.persistence.annotations.PersistentClass;
import uqbar.arena.persistence.annotations.PersistentField;
import uqbar.arena.persistence.annotations.Relation;

import ar.com.aterrizar.aerolineas.AeroLanchita;
import ar.com.aterrizar.aerolineas.Aerolinea;
import ar.com.aterrizar.entidades.Cliente;
import ar.com.aterrizar.entidades.TipoDeClaseAsiento;
import ar.com.aterrizar.entidades.TipoDeUbicacionAsiento;
import ar.com.aterrizar.fecha.Fecha;
import ar.com.aterrizar.operaciones.Reserva;
@Transactional
@Observable
@PersistentClass
public class AsientoLanchita extends Asiento {



	private String codAsiento;
	private Float precio;
	private TipoDeClaseAsiento clase; 
	private TipoDeUbicacionAsiento ubicacion;  
	private Boolean disponibilidad;
	private String origen;
	private String destino;
	private Fecha fechaYHoraSalida; 
	private Fecha fechaYHoraLlegada; 
	private Reserva reserva=new Reserva();
	private AeroLanchita aerolinea;
	private String fechaDeSalida;

	public AsientoLanchita(String codAsiento, Float precio, TipoDeClaseAsiento clase, TipoDeUbicacionAsiento ubicacion,
			Boolean disponibilidad, String fechaYHoraSalidaString, String fechaYHoraLlegadaString, String origen, String destino){


		this.codAsiento = codAsiento;
		this.precio = precio;
		this.clase = clase;
		this.ubicacion = ubicacion;
		this.disponibilidad = disponibilidad;
		this.origen = origen;
		this.destino = destino;
		fechaYHoraSalida = new Fecha(fechaYHoraSalidaString);
		fechaYHoraLlegada = new Fecha(fechaYHoraLlegadaString);
		aerolinea = AeroLanchita.getInstance();
	}

	/**
	 * Solo para test
	 *  
	 * @param codAsiento String
	 * @param precio Float
	 * @param clase TipoDeClaseAsiento
	 * @param ubicacion TipoDeUbicacionAsiento
	 * @param disponibilidad Boolean
	 * @param horaDeSalida String
	 * @param horaDeLlegada String
	 * @param origen String
	 * @param destino String
	 * @param fechaSalida String
	 * @param fechaLlegada String
	 * 
	 */

	public  AsientoLanchita(String codigo){
		this.codAsiento = codigo;
		this.precio = (float)20;
		this.clase = TipoDeClaseAsiento.PRIMERACLASE;
		this.ubicacion = TipoDeUbicacionAsiento.VENTANA;
		this.disponibilidad = true;
		this.origen = "EZE";
		this.destino = "USA";
		fechaYHoraSalida = new Fecha("20/12/2012 20:00");
		fechaYHoraLlegada = new Fecha("21/12/2012 19:00");
		aerolinea = AeroLanchita.getInstance();
		this.fechaDeSalida = fechaYHoraLlegada.getFecha().toString();
	}	
	
	@Relation
	public Fecha getFechaDeSalidaYHora() {
		return fechaYHoraSalida;
	}
	
	@Relation
	public Fecha getFechaDeLlegadaYHora() {
		return fechaYHoraLlegada;
	}

	@PersistentField
	public String getOrigen() {
		return origen;
	}

	@PersistentField
	public String getDestino() {
		return destino;
	}

	@PersistentField
	public TipoDeClaseAsiento getClase() {
		return clase;
	}

	@PersistentField
	public TipoDeUbicacionAsiento getUbicacion() {
		return ubicacion;
	}

	public Float getPrecio(Cliente cliente) {
		if(cliente.tenesCuenta()){
			return (getPrecioBase() * (float)1.15);
		}
		return (getPrecioBase() * (float)1.15 + cliente.recargoDeCuenta());
	}

	@PersistentField
	public String getCodVuelo() {
		String[] array = codAsiento.split("-");
		return array[0];
	}

	@PersistentField
	public String getCodigoDeAsiento(){
		return getCodVuelo()+ "-"+ getNumAsiento().toString();
	}

	public void setReserva(Reserva reserva) {
		this.reserva = reserva;
	}

	@PersistentField
	public Reserva getReserva() {
		return reserva;
	}

	@PersistentField
	public Boolean getDisponibilidad() {
		return disponibilidad;
	}

	@PersistentField
	public Aerolinea getAerolinea(){
		return this.aerolinea;
	}
	
	@PersistentField
	public String getAerolineaNombre(){
		return this.aerolinea.getAerolinea();
	}
	
	@PersistentField
	private Float getPrecioBase() {
		return this.precio;
	}

	@PersistentField
	public Integer getNumAsiento() {
		String[] array = codAsiento.split("-");

		return Integer.parseInt(array[1]); 
	}

	@PersistentField
	public long getTiempoDeVuelo() {
		return fechaYHoraLlegada.getFecha().getTime() - fechaYHoraSalida.getFecha().getTime();
	}

	public Cliente getClienteQueReservo() {
		return this.getReserva().getClientes().get(0);
	}
	
	@PersistentField
	public String getFechaDeSalida(){
		return fechaDeSalida;	
	}


	@Override
	public Boolean estaReservado(Cliente cliente) {
		for(Asiento asiento:cliente.getAsientosReservados()){
			if(asiento.getCodigoDeAsiento().equals(this.getCodigoDeAsiento())){
				return true;
			}
		}
		return false;
	}

	@Override
	public Boolean estaComprado() {
		for(Asiento asiento:this.aerolinea.vuelosComprados()){
			if(this.getCodigoDeAsiento().equals(asiento.getCodigoDeAsiento())){
				return true;
			}
		}
		return false;
	}

	@Override
	public Boolean estaReservado() {
		return !this.disponibilidad;
	}

	@PersistentField
	public Float getPrecio() {
		return this.precio;
	}

	@PersistentField
	public Fecha getFechaYHoraSalida() {
		return this.fechaYHoraSalida;
	}

	@PersistentField
	public Fecha getFechaYHoraLlegada() {
		return this.fechaYHoraLlegada;
	}

	@Override
	public void setPrecio(float precio) {
		this.precio=precio;
	}

	@Override
	public void setClase(TipoDeClaseAsiento clase) {
		this.clase=clase;
	}

	@Override
	public void setUbicacion(TipoDeUbicacionAsiento ubicacion) {
		this.ubicacion=ubicacion;
	}

	@Override
	public void setDisponibilidad(boolean disponibilidad) {
		this.disponibilidad=disponibilidad;
	}

	@Override
	public void setOrigen(String origen) {
		this.origen=origen;
	}

	@Override
	public void setDestino(String destino) {
		this.destino=destino;
	}

	@Override
	public void setFechaYHoraSalida(Fecha fecha) {
		this.fechaYHoraSalida=fecha;
	}

	@Override
	public void setFechaYHoraLlegada(Fecha fecha) {
		this.fechaYHoraLlegada=fecha;
	}

	@Override
	public void setAerolinea(Aerolinea aerolinea) {
		this.aerolinea=(AeroLanchita) aerolinea;
	}

	@Override
	public void setFechaDeSalida(String fecha) {
		this.fechaDeSalida=fecha;
	}
}

